package it.unisa.unibox.gestioneProdotti;

import it.unisa.unibox.beans.Prodotto;
import it.unisa.unibox.commons.OrdinamentoProdotti;
import it.unisa.unibox.commons.XMLParser;
import it.unisa.unibox.facade.FacadeProdotti;
import it.unisa.unibox.facade.IFacadeProdotti;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;



public class RicercaProdottiServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public static ServletContext servletContext;
	public static IFacadeProdotti facade;
	
	
	
    public RicercaProdottiServlet() {
        super();
    }


	@Override
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
			facade = new FacadeProdotti();
		} 
		
		catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// legge i parametri
		
		String tipologia = request.getParameter("tipologia");
		String annoDaStr = request.getParameter("annoDa");
		String annoAStr = request.getParameter("annoA");
		String titolo = request.getParameter("titolo");
		String nome = request.getParameter("nome");
		String cognome = request.getParameter("cognome");
		String cod_fiscale = request.getParameter("cod_fiscale");
		Integer dipartimento;
		Integer area_scientifica;
		
		int annoDa;
		int annoA;
		if(annoDaStr.equals(""))
			annoDa=-1;
		else
			annoDa = Integer.parseInt(annoDaStr);
		
		if(annoAStr.equals(""))
			annoA=-1;
		else
			annoA = Integer.parseInt(annoAStr);
		
		try{
			dipartimento = Integer.parseInt(request.getParameter("dipartimento"));
		}catch(Exception e){
			dipartimento=null;
		}
		try{
			area_scientifica=Integer.parseInt(request.getParameter("area_scientifica"));
		}catch(Exception e){
			area_scientifica=null;
		}
		
		
		
	/*	System.out.println("tipologia:"+ tipologia+" annoDa:" +annoDa+" annoA: "+annoA+" titolo: "+titolo
				+" nome: "+nome+" cognome: "+cognome+" cod_fiscale: "+cod_fiscale+" dipartimento: "+request.getParameter("dipartimento")
				+"area_scientifica: "+request.getParameter("area_scientifica"));
		
		*/ 
		
		
		// effettua l'operazione di reperimento dei dati, funzionava solo con lo stub :)
		ArrayList<Prodotto> lista = facade.ricercaProdotti(tipologia,annoDa,annoA,titolo,nome,cognome,cod_fiscale,dipartimento,area_scientifica);
	
		String ordine = request.getParameter("ordine");
		
		OrdinamentoProdotti.ordina(lista, ordine);
		
			
		//	testUtility.stampa_r(lista);
		
		// converte l'output in XML
		Document doc;
		if(!controllaCampiRicerca(titolo, nome, cognome, cod_fiscale))
			doc = XMLParser.errore();
		else
			doc = XMLParser.ricercaProdotti(lista);
		
		// risponde al client
		XMLOutputter xml_out = new XMLOutputter();
		xml_out.setFormat(Format.getPrettyFormat());
		response.setContentType("text/xml");
		response.setHeader("Cache-Control",	"no-store, no-cache, must-revalidate");     
		PrintWriter out = response.getWriter(); 
		// test --> xml_out.output(doc, new FileOutputStream(new File("prova.xml")));
		xml_out.output(doc, out);

	}
	
	
	private static boolean controllaCampiRicerca(String titolo, String nome, String cognome,String cod_fiscale){
		if(titolo.length() > 120 //TODO || !UtilityFunctions.checkTitolo(titolo)
			|| cognome.length() > 20 || (cognome.indexOf('0'))>-1 || (cognome.indexOf('1'))>-1
			|| (cognome.indexOf('2'))>-1 || (cognome.indexOf('3'))>-1 || (cognome.indexOf('4'))>-1
			|| (cognome.indexOf('5'))>-1 || (cognome.indexOf('6'))>-1 || (cognome.indexOf('7'))>-1
			|| (cognome.indexOf('8'))>-1 || (cognome.indexOf('9'))>-1 //|| !checkSpecialChars(cognome) TODO caratteri speciali
			|| nome.length() > 20 || (nome.indexOf('0'))>-1 || (nome.indexOf('1'))>-1
			|| (nome.indexOf('2'))>-1 || (nome.indexOf('3'))>-1 || (nome.indexOf('4'))>-1
			|| (nome.indexOf('5'))>-1 || (nome.indexOf('6'))>-1 || (nome.indexOf('7'))>-1
			|| (nome.indexOf('8'))>-1 || (nome.indexOf('9'))>-1 //|| !checkSpecialChars(nome)TODO caratteri speciali
			|| cod_fiscale.length() > 16) //|| !checkSpecialChars(cod_fiscale)) TODO caratteri speciali
			return false;
		
		return true;
	}
	
	private static boolean checkSpecialChars(String s){
		char ch;
		for(int i=0; i<s.length();i++){
			ch = s.charAt(i);
			if(!Character.isLetter(ch) && !Character.isWhitespace(ch))
				return false;
		}
		
		return true;
	}

}